﻿using System;
using System.Collections.Generic;
using Security.Specs.Common;

namespace Security.Events.Commands
{
    /// <summary>
    /// Абстрактный класс команды
    /// </summary>
    public abstract class CommandBase 
    {
        /// <summary>
        /// Список ошибок возникших во время выполнения команды
        /// </summary>
        private IList<ErrorReport> executionErrors;

        /// <summary>
        /// идентификатор сессии в которой выполняется команда
        /// </summary>
        /// <remarks>
        /// Сессии используются для обьединения команд в одну логическую группу
        /// </remarks>
        public Guid SessionId { get; set; }

        /// <summary>
        /// Была ли выполнена команда 
        /// </summary>
        public bool Executed
        {
            get
            {
                return executionErrors == null || executionErrors.Count == 0;
            }
        }

        /// <summary>
        /// Список ошибок возникших во время выполнения команды
        /// </summary>
        public IList<ErrorReport> ExecutionErrors
        {
            get
            {
                if (executionErrors == null)
                    executionErrors = new List<ErrorReport>();

                return executionErrors;
            }
        }

        protected CommandBase()
        {
            SessionId = Guid.NewGuid();
        }

        /// <summary>
        /// Присоединяет команду к существующей сессии
        /// </summary>
        /// <param name="sessionId">Идентификатор сессии<see cref="SessionId"/></param>
        public void AppendToSession(Guid sessionId)
        {
            this.SessionId = sessionId;
        }
    }
}
